﻿using Windows.UI.Xaml;

namespace Uhimania.Libraries.Windows.Interactivity
{
    #region TriggerAction
    /// <summary>
    /// 機能単位をカプセル化する、アタッチ可能なオブジェクトを表す。
    /// </summary>
    public abstract class TriggerAction : AttachedObjectBase
    {
        #region Invoke

        /// <summary>
        /// アクションを呼び出す。
        /// </summary>
        /// <param name="parameter">アクションへのパラメータ。</param>
        protected abstract void Invoke(object parameter);

        /// <summary>
        /// アクションを呼び出す。
        /// </summary>
        /// <param name="parameter">アクションへのパラメータ。</param>
        internal void CallInvoke(object parameter)
        {
            this.Invoke(parameter);
        }

        #endregion
    }
    #endregion

    #region TriggerAction<T>
    /// <summary>
    /// 機能単位をカプセル化する、アタッチ可能なオブジェクトを表す。
    /// </summary>
    /// <typeparam name="T"><see cref="TriggerAction" /> をアタッチできる型。</typeparam>
    public abstract class TriggerAction<T> : TriggerAction
        where T : DependencyObject
    {
        #region AssociatedObject
        /// <summary>
        /// この <see cref="TriggerAction" /> がアタッチされるオブジェクトを取得する。
        /// </summary>
        public new T AssociatedObject
        {
            get { return base.AssociatedObject as T; }
        }
        #endregion
    }
    #endregion
}
